package com.sz.biz.logistics.ord.service;

import com.sz.biz.logistics.core.entity.ProductServiceRel;
import com.sz.biz.logistics.ord.dto.*;
import com.sz.biz.logistics.ord.entity.OrdOrder;
import com.sz.biz.logistics.ord.entity.OrdOrderStatusCode;
import com.sz.biz.logistics.ord.entity.OrderDetail;
import com.sz.biz.logistics.ord.entity.OrderStatus;
import com.sz.biz.logistics.ord.service.impl.OrdTrackingResult;
import com.sz.biz.logistics.serialno.entity.SerialNoManagement;
import com.sz.common.base.dto.CommonModel;
import com.sz.common.base.dto.QResultDto;
import com.sz.common.base.dto.QueryParams;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * Function: 产品订单service <br>
 * Author: hpeng.wang <br>
 * Date: 2017-03-31 13:46:00
 */

public interface OrdOrderService {


    /**
     * 新增
     *
     * @param dto 新增的实体dto
     * @return 新增是否成功
     */
    String saveOrderDto(OrdOrderDto dto);

    void batchSaveOrder(List<OrdOrder> ordOrderList, List<SerialNoManagement> serialNoManagementList);

    /**
     * 保存客户的用户的地址(收件地址、发件地址、揽收地址)
     *
     * @param dto 要处理的orderdto
     * @return
     */
    void saveCusUserAddress(OrdOrderDto dto) throws Exception;


    /**
     * 根据运单编号集合删除实体
     *
     * @param orderNos 运单编号集合
     */
    void batchDeleteByOrderNos(List<String> orderNos);


    /**
     * 修改订单
     *
     * @param orderDto
     * @param userType
     */
    void updateByDto(OrdOrderDto orderDto, String userType);

    void update(OrdOrder order);

    int batchUpdate(List<OrdOrder> orders);

    /**
     * 根据订单信息将订单变成订单list
     *
     * @param type
     * @param orderList
     */
    void updateOrderStatusToAccept(List<OrdOrder> orderList);

    /**
     * 根据orderNo获取产品订单
     *
     * @param orderNo 产品运单的编号
     * @return 产品订单
     */
    OrdOrder findByOrderNo(String orderNo);

    List<OrdOrder> findByOrderNos(List<String> orderNos);

    OrdOrder findByWaybillNo(String waybillNo);

    List<OrdOrder> findByWaybillNos(List<String> waybillNos);

    List<String> findOrderNoByOrderStatus(OrderStatus orderStatus);

    /**
     * 根据orderNo获取当前订单的状态
     *
     * @param orderNo 产品订单编号
     * @return 产品订单的状态
     */
    OrderStatus findOrderStatus(String orderNo);

    /**
     * 根据运单编号查询（orderNo）查询产品订单dto信息
     *
     * @param orderNo 产品运单编号
     * @return 产品订单dto
     */
    OrdOrderDto findDtoByOrderNo(String orderNo);

    /**
     * 根据运单号集合，批量获取信息
     *
     * @param orderNos
     * @return
     */
    List<OrdOrderDto> findDtosByOrderNos(List<String> orderNos);

    /**
     * 根据集合信息查询数据
     *
     * @param params 查询的参数集
     * @return 查询出的数据
     */
    QResultDto findDtoByParam(QueryParams params);

    /**
     * 订单查询
     *
     * @param params
     * @return
     */
    QResultDto findSearchDtoByParam(QueryParams params);


    /**
     * @param rankList
     * @param waybillNo
     * @return
     */
    Map<String, List<OrdOrderTrackingShowDto>> findTrackByWaybillNo(List<Integer> rankList, String waybillNo);

    /**
     * 查询当前订单所选择的服务（包含可选服务与必选服务，并且是带顺序的）
     *
     * @param orderNo 订单的运单号
     * @return 集合信息
     */
    List<CommonModel> findServiceByOrderNo(String orderNo);

    /**
     * 获取所有的订单状态数据
     *
     * @return
     */
    List<CommonModel> getAllOrderStatus();

    /**
     * 获取订单支付状态数据
     *
     * @return
     */
    List<CommonModel> getOrderPayStatus();

    /**
     * TODO： 生成订单的计费数据，为了测试，后期需要删掉
     *
     * @param orderNo
     */
    void generateBillData(String orderNo);


    /**
     * 根据订单编号获取ServiceForTestDto
     *
     * @param orderNo
     * @return
     */
    List<ServiceForOrderDto> getServiceDtos(String orderNo);

    /**
     * 1、收到物流信息之后，更新订单和子单的重量、长、宽、高等信息
     * 2、如果为收货状态，重新分派服务，更新计费重、体积重
     * @param trackingSupOrder 要处理的tracking信息
     * @param order               订单信息
     */
    OrdTrackingResult processOrderInfoByTracking(TrackingSupOrder trackingSupOrder, OrdOrder order);


    //  void processOrderByTrackingAfter(TrackingSupOrder trackingToSystemDto, OrdOrder order, OrdSubOrder ordSubOrder);


    /**
     * 供应商传过来正常物流消息时更新订单、子订单的状态
     * @param trackingOrderStatusCode
     * @param orderStatusCode
     * @param subOrderList
     */
    // boolean processStatusByNormalTracking(String trackingOrderStatusCode, OrderStatus orderStatusCode, List<OrdSubOrder> subOrderList);

    /**
     * 根据订单获取对应产品下的服务
     *
     * @param productUid
     * @param date
     * @return
     */
    List<ProductServiceRel> getProductServiceRelsByProductUid(String productUid, Date date);

    /**
     * 检查serviceUid是否为订单的服务商之一
     *
     * @param ordOrder
     * @param serviceUid
     * @return
     */
    boolean validateServiceUid(OrdOrder ordOrder, String serviceUid, Integer supplierId);

    /**
     * 获取2个月内还没有计费的运单
     *
     * @param type 1采购价 2销售价
     */
    List<OrdOrder> findNoCalcedWaybills(int type);

    /**
     * 获取7月内还没有分配供应商的运单
     */
    List<OrdOrder> findNoAssignServiceBills();

    /**
     * 根据订单状态获取订单的信息
     *
     * @param orderStatus 订单的状态
     * @param beginRow    开始的row
     * @param endRow      结束的row
     * @return 订单的集合
     */
    List<OrdOrder> findByOrderStatus(OrderStatus orderStatus, Integer beginRow, Integer endRow);

    /**
     * 根据运单号获取数据
     *
     * @param orderNo 运单号
     * @return 订单数据
     */
    OrdOrderCusUserDto findCusUserByOrderNo(String orderNo);

    /**
     * 根据statuscode 处理订单的状态
     *
     * @param oldOrder
     * @param statusCode
     */
    void updateSatus(OrdOrder oldOrder, OrdOrderStatusCode statusCode);

    /**
     * @param processOrderMap orderNo,OrderStatus 的集合
     */
    void updateOrderStatus(Map<String, OrderStatus> processOrderMap);

    /**
     * 批量把订单从草稿状态改成已提交状态
     *
     * @param orderNos 订单号的集合
     */
    void updateCommitedByOrderNos(List<String> orderNos);

    void updateAcceptByOrderNos(List<String> orderNos);

    void updateOrderStatus(String orderNo, OrderStatus orderStatus);

    /**
     * 根据客户的账号id和外部关联号，查找订单
     *
     * @param externalNo
     * @param customerId
     * @return
     */
    OrdOrder findByExternalNoAndCustomerId(String externalNo, int customerId, int id);


    /**
     * 通过订单id 数组 给客户发送消息
     *
     * @param orders
     */
    void sendOrderStatusMessage(List<String> orders);

    /**
     * 判断订单是否能够发送
     *
     * @param orders
     */
    OrderMessageList getOrderMessageList(List<String> orders);


    /**
     * 订单详情 根据订单号（暂时先用运单号）展示费用，支付状态，客户类型等
     */
    OrdOrderFeePayDto findOrderFeeInfo(String orderNo);

    /**
     * 根据运单号查询运单号、订单号的map
     *
     * @param waybillNos 运单号集合
     * @return 运单号、订单号的map
     */
    Map<String, String> findNoMapByWaybillNos(List<String> waybillNos);

    /**
     * 根据运单号获取订单号集合
     *
     * @param waybillNos 运单号集合
     * @return 订单号集合
     */
    List<String> findOrderNosByWaybillNos(List<String> waybillNos);


    /**
     * 根据运单号查询订单号
     *
     * @param waybillNo 运单号
     * @return 订单号
     */
    String findOrderNoByWaybillNo(String waybillNo);

    /**
     * 根据订单号查询订单号、运单号的map
     *
     * @param orderNos 订单号集合
     * @return 订单号、运单号的map
     */
    Map<String, String> findNoMapByOrderNos(List<String> orderNos);

    /**
     * 根据订单号查询运单号集合
     *
     * @param orderNos 订单号集合
     * @return 运单号集合
     */
    List<String> findWaybillNosByOrderNos(List<String> orderNos);

    /**
     * 根据订单号查询运单号
     *
     * @param orderNo 订单号
     * @return 运单号
     */
    String findWaybillNoByOrderNo(String orderNo);

    /**
     * 根据订单号查询订单选择的服务信息
     *
     * @param orderNo 订单号
     * @param bOk
     * @return 服务信息详情
     */
    List<OrdOrderServiceInfoDto> findOrderServiceInfo(String orderNo, boolean bOk);


    boolean isExistOptionService(List<OrdOrderAdditionalDto> orderAdditionalDtos, String productUid);

    OrdOrderDto findDtoByWaybillNo(String waybillNo);



    void sendOutgoingMessage(String orderNo);

    void payOrder(String orderNo);
    List<OrderDetail> getOrders();
}
